package com.stsdai.search.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.stsdai.common.pojo.StsdaiResult;
import com.stsdai.manager.mapper.ItemMapper;
import com.stsdai.manager.pojo.Item;
import com.stsdai.search.service.SearchService;

@Service
public class SearchServiceImpl implements SearchService {

	@Autowired
	private CloudSolrServer cloudSolrServer;
	
	@Autowired
	private ItemMapper itemMapper;

	@Override
	public StsdaiResult<Item> search(String q, Integer page, Integer rows) {
		// 声明返回对象
		StsdaiResult<Item> stsdaiResult = new StsdaiResult<>();

		// 声明查询对象
		SolrQuery solrQuery = new SolrQuery();

		// 设置查询语句
		// 判断查询关键词是否为非空
		if (StringUtils.isNotBlank(q)) {
			solrQuery.setQuery("item_title:" + q + " AND item_status:1");
		} else {
			// 如果没有关键词，查询所有状态为正常的商品
			solrQuery.setQuery("item_status:1");
		}

		// 设置分页
		solrQuery.setStart((page - 1) * rows);
		solrQuery.setRows(rows);

		// 设置高亮
		solrQuery.setHighlight(true);
		solrQuery.addHighlightField("item_title");
		solrQuery.setHighlightSimplePre("<font color='red'>");
		solrQuery.setHighlightSimplePost("</font>");

		try {
			// 使用CloudSolrServer执行查询，获取response
			QueryResponse response = this.cloudSolrServer.query(solrQuery);

			// 获取高亮数据
			// {
			// "c002": {"item_title": ["<em>sol"]},
			// "c001": {"item_title": ["今天使用<"]}
			// }
			Map<String, Map<String, List<String>>> map = response.getHighlighting();

			// 使用response获取结果集results
			SolrDocumentList results = response.getResults();

			// 声明存放商品结果集的容器
			List<Item> items = new ArrayList<>();

			// 遍历results，获取查询的数据
			for (SolrDocument solrDocument : results) {
				// 解析高亮数据
				List<String> hlist = map.get(solrDocument.get("id").toString()).get("item_title");

				// 创建商品对象
				Item item = new Item();

				// 设置商品数据
				// 商品id
				item.setId(Long.parseLong(solrDocument.get("id").toString()));
				// 商品item_title
				// 判断是否有高亮数据
				if (hlist != null && hlist.size() > 0) {
					item.setTitle(hlist.get(0));
				} else {
					// 如果没有高亮数据，就设置原始的商品标题
					item.setTitle(solrDocument.get("item_title").toString());
				}
				// 商品item_price
				item.setPrice(Long.parseLong(solrDocument.get("item_price").toString()));
				// 商品item_image
				item.setImage(solrDocument.get("item_image").toString());
				// 商品item_cid
				item.setCid(Long.parseLong(solrDocument.get("item_cid").toString()));
				// 商品item_status,返回结果数据没有status，在配置Field域的时候，设置不存储

				// 把封装好的商品对象放到容器
				items.add(item);
			}

			// 封装返回对象StsdaiResult
			// 设置商品查询结果集
			stsdaiResult.setRows(items);
			// 设置查询的总记录数
			stsdaiResult.setTotal(results.getNumFound());

			// 返回数据
			return stsdaiResult;
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 如果查询不到或者有异常，返回空对象
		return stsdaiResult;
	}

	@Override
	public void addItem(long itemId) {
		// 根据商品id从MySQL中查询商品数据
		Item item = this.itemMapper.selectByPrimaryKey(itemId);

		// 使用商品数据封装SolrInputDocument
		// 声明doc
		SolrInputDocument doc = new SolrInputDocument();

		// 设置商品数据到doc中
		// 商品id
		doc.addField("id", item.getId());
		// 商品item_title
		doc.addField("item_title", item.getTitle());
		// 商品item_price
		doc.addField("item_price", item.getPrice());
		// 商品item_image
		doc.addField("item_image", item.getImage());
		// 商品item_cid
		doc.addField("item_cid", item.getCid());
		// 商品item_status
		doc.addField("item_status", item.getStatus());

		try {
			// 使用CloudSolrServer把doc数据保存到索引库中
			this.cloudSolrServer.add(doc);
			this.cloudSolrServer.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
